home *** CD-ROM | disk | FTP | other *** search
- unit NameHlpU;
-
- {$ifdef Ver90} //Delphi 2
- {$define Delphi2}
- {$endif}
- {$ifdef Ver93} //BCB1
- {$define Delphi2}
- {$endif}
-
- interface
-
- uses
- {$ifdef Delphi2} //BCB1
- OLE2,
- {$endif}
- ShlObj,
- Classes;
-
- function CreateFolderObject(const ClsID: TGuid): IShellFolder;
- procedure GetFolderItems(Folder: IShellFolder; List: TStrings);
- function GetSpecialFolderClsID(const FolderName: String): TGuid;
- function GetSpecialFolderLocation(Folder: Cardinal): String;
-
- implementation
-
- uses
- {$ifdef Delphi2}
- OleAuto,
- {$else}
- ComObj, ActiveX,
- {$endif}
- Forms, Windows, SysUtils, Registry, IniFiles;
-
- var
- Malloc: IMalloc;
-
- function CreateFolderObject(const ClsID: TGuid): IShellFolder;
- begin
- {$ifdef Delphi2}
- OleCheck(CoCreateInstance(ClsID, nil, CLSCTX_INPROC_SERVER or
- CLSCTX_LOCAL_SERVER, IID_IShellFolder, Result));
- {$else}
- Result := CreateCOMObject(ClsID) as IShellFolder
- {$endif}
- end;
-
- procedure GetFolderItems(Folder: IShellFolder; List: TStrings);
- var
- Enum: IEnumIDList;
- PIDL: PItemIDList;
- Fetched: {$ifdef Delphi2}ULong{$else}DWord{$endif};
- StrRet: TStrRet;
- begin
- //Get enumeration object, just for files - not folders
- OleCheck(Folder.EnumObjects(
- Application.Handle, SHCONTF_NONFOLDERS, Enum));
- List.BeginUpdate;
- try
- List.Clear;
- //Get 1 item at a time. Not efficient, but still...
- while (Enum.Next(1, PIDL, Fetched) = NOERROR) and (Fetched = 1) do
- begin
- //Ask for the name
- OleCheck(Folder.GetDisplayNameOf(PIDL, SHGDN_FORPARSING, StrRet));
- //It may come back in a number of formats
- case StrRet.uType of
- STRRET_WSTR:
- begin
- List.Add(WideCharToString(StrRet.pOleStr));
- Malloc.Free(StrRet.pOleStr)
- end;
- STRRET_OFFSET:
- List.Add(PChar(Cardinal(PIDL) + StrRet.uOffset));
- STRRET_CSTR:
- List.Add(StrRet.cStr);
- end;
- //Free item
- Malloc.Free(PIDL);
- end;
- finally
- List.EndUpdate
- end
- end;
-
- function GetSpecialFolderClsID(const FolderName: String): TGuid;
- var
- ClsID: String;
- {$ifdef Delphi2}
- const
- REGSTR_PATH_EXPLORER = 'Software\Microsoft\Windows\CurrentVersion\Explorer';
- REGSTR_PATH_SPECIAL_FOLDERS = REGSTR_PATH_EXPLORER + '\Shell Folders';
- {$endif}
- begin
- with TRegistry.Create do
- try
- //Locate special folders in registry
- if OpenKey(REGSTR_PATH_SPECIAL_FOLDERS, False) then
- //Read requested folder name & read DESKTOP.INI
- with TIniFile.Create(ReadString(FolderName) + '\DESKTOP.INI') do
- try
- //Entry should be marked as CLSID or UICLSID
- ClsID := ReadString('.ShellClassInfo', 'CLSID', '');
- if ClsID = '' then
- ClsID := ReadString('.ShellClassInfo', 'UICLSID', '');
- //Translate from string to real GUID record
- Result := {$ifdef Delphi2}StringToClassID(ClsID){$else}StringToGUID(ClsID){$endif}
- finally
- Free //delete TIniFile
- end;
- finally
- Free //Delete TRegistry
- end;
- end;
-
- function GetSpecialFolderLocation(Folder: Cardinal): String;
- var
- PIDList: PItemIDList;
- Buf: array[0..MAX_PATH] of Char;
- begin
- Result := 'Not available';
- if (SHGetSpecialFolderLocation(
- Application.Handle, Folder, PIDList) = NOERROR) and
- SHGetPathFromIDList(PIDList, Buf) then
- begin
- Result := Buf;
- Malloc.Free(PIDList)
- end
- end;
-
- initialization
- ShGetMalloc(Malloc);
- end.
-